package main

import "fmt"

func main() {

	//	函数和方法不一样
	//	方法是作用在指定的数据类型上，和指定的数据类型绑定，因此自定义类型，都可以有方法，而不仅仅是struck
	//	方法的生命和调用格式

	// todo 使用方法的注意事项
	// (1) 结构体类型是值类型，在方法调用中，遵循值类型的传递机制，使值拷贝传递方式
	// (2) 如果程序员洗完在方法中，力改结构体变量中的值，可以通过结构体指针的方式来处理
	// (3) 方法默认是值拷贝，需要修改值，请传递*Person指针变量
	// (4) 方法的访问范围控制的规则，和函数一样。方法名首字母小写，只能在本包内访问，方法首字母大写，可以在本包和其他包访问
	// (5) 如果一个类型实现了String()这个方法，那么fmt.Println默认会调用这个变量的String()进行输出

	var per = new(Person)
	per.id = 100
	per.Age = 24
	per.Name = "白百合"

	// 执行结构体的方法  方法是值传递，不是引用传递
	per.Name = "卡布达"
	per.printField()
	fmt.Println(per.Name)

	fmt.Println("---------------------------------------")
	per.printField2()
	fmt.Println(per.Name)
}

type Person struct {
	Age  int
	Name string
	id   int
}

// 方法 值传递
func (p Person) printField() {
	p.Name = "铁甲小宝"
	fmt.Println("id=", p.id)
	fmt.Println("name=", p.Name)
	fmt.Println("age=", p.Age)
}

// 方法 引用传递
func (p *Person) printField2() {
	p.Name = "铁甲小宝"
	fmt.Println("id=", p.id)
	fmt.Println("name=", p.Name)
	fmt.Println("age=", p.Age)
}
